/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Controleur;

import Controleur.TableModel.IncidentTableModel;
import Controleur.TableModel.TechnicienTableModel;
import Controleur.TableModel.TypeIncTableModel;
import Controleur.TableModel.VeloTableMobel;
import DAO.ChampsBDD;
import DAO.DAOFactory;
import DAO.IncidentDAOmysql;
import DAO.IncidentDao;
import DAO.TypeIncidentDAOmysql;
import DAO.TypeIncidentDao;
import DAO.UtilisateurDAOmysql;
import DAO.UtilisateurDao;
import DAO.VeloDAOmysql;
import DAO.VeloDao;
import Modele.Incident;
import Modele.Technicien;
import Modele.TypeIncident;
import Modele.Utilisateur;
import Modele.Velo;
import Utils.Constantes;
import Vue.FenetrePrincipale;
import Vue.IncidentForm;
import Vue.TechnicienForm;
import Vue.TypeIncidentForm;
import Vue.VeloForm;
import java.util.ArrayList;
import nemovelo.NemoVelo;

/**
 *
 * @author 20cent
 */
public class FenetrePrincipaleControleur implements Observeur.Observeur {

    private FenetrePrincipale fenetre;
    private VeloDao veloDao;
    private IncidentDao incidentDao;
    private TypeIncidentDao typeDao;
    private UtilisateurDao utilisateurDao;
    private VeloTableMobel veloModel;
    private IncidentTableModel incidentTableModel;
    private TypeIncTableModel typeTableModel;
    private TechnicienTableModel technicienTableModel;

    public FenetrePrincipaleControleur(FenetrePrincipale fenetre) {
        this.fenetre = fenetre;

        DAOFactory factory = DAOFactory.getInstance();
        veloDao = new VeloDAOmysql(factory);
        incidentDao = new IncidentDAOmysql(factory);
        typeDao = new TypeIncidentDAOmysql(factory);
        utilisateurDao = new UtilisateurDAOmysql(factory);

        veloModel = new VeloTableMobel(NemoVelo.velos);
        incidentTableModel = new IncidentTableModel(NemoVelo.incidents);
        typeTableModel = new TypeIncTableModel(NemoVelo.typesIncident);
        technicienTableModel = new TechnicienTableModel(NemoVelo.techniciens);

        //on appliques les modeles à nos jTable
        this.fenetre.appliquerVeloModel(veloModel);
        veloModel.fireTableStructureChanged();
        this.fenetre.appliquerIncidentModel(incidentTableModel);
        incidentTableModel.fireTableStructureChanged();
        this.fenetre.appliquerTypeIncModel(typeTableModel);
        typeTableModel.fireTableStructureChanged();
        incidentTableModel.fireTableStructureChanged();
        this.fenetre.appliquerTechnicienModel(technicienTableModel);
        technicienTableModel.fireTableStructureChanged();
        
        //Observer les données
        NemoVelo.incidents.ajouterObserveur(this);
        NemoVelo.techniciens.ajouterObserveur(this);
        NemoVelo.typesIncident.ajouterObserveur(this);
        NemoVelo.velos.ajouterObserveur(this);
    }

    public void recuperVelos() {

        java.awt.EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {

                for (Velo velo : veloDao.getAll(1)) {
                    velo.ajouterObserveur(FenetrePrincipaleControleur.this);
                    NemoVelo.velos.add(velo);
                }
            }
        });
    }

    public void recuperIncidents(Technicien technicien, String statut, String priorite) {
        //On prépare la requète
         ArrayList<String> champs = new ArrayList<>();
         ArrayList<String> valeurs = new ArrayList<>();
         if(technicien != null){
             champs.add(ChampsBDD.TECHNICIEN_ID);
             valeurs.add(String.valueOf(technicien.getMId()));
         }
         if(statut != null){
             champs.add(ChampsBDD.INCIDENT_STATUT);
             valeurs.add(statut);
         }
         if(priorite != null){
             champs.add(ChampsBDD.INCIDENT_PRIORITE);
             valeurs.add(priorite);
         }
         
         final String[] champsArray = champs.toArray(new String[champs.size()]);
         final String[] valeursArray = valeurs.toArray(new String[valeurs.size()]);

        java.awt.EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                NemoVelo.incidents.clear();
                for (Incident incident : incidentDao.getByFilter(champsArray, valeursArray)) {
                    incident.ajouterObserveur(FenetrePrincipaleControleur.this);
                    NemoVelo.incidents.add(incident);
                }
            }
        });
    }

    public void recuperTypesIncidents() {
        
        java.awt.EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                for (TypeIncident type : typeDao.getAll(1)) {
                    type.ajouterObserveur(FenetrePrincipaleControleur.this);
                    NemoVelo.typesIncident.add(type);
                }
            }
        });
    }

    public void recuperTechniciens() {
        java.awt.EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                ArrayList<Utilisateur> temp = utilisateurDao.getByType(Constantes.TYPE_TECH);
                for (Utilisateur technicien : utilisateurDao.getByType(Constantes.TYPE_TECH)) {
                    technicien.ajouterObserveur(FenetrePrincipaleControleur.this);
                    NemoVelo.techniciens.add((Technicien) technicien);
                }
                fenetre.setTechnicienComboFilter(NemoVelo.techniciens);
            }
        });
    }

    public void afficherTypeIncDetail(int row) {
        new TypeIncidentForm(fenetre, true, TypeFormulaire.AFFICHAGE, NemoVelo.typesIncident.get(row)).setVisible(true);
    }

    public void afficherTechnicienDetail(int row) {
        new TechnicienForm(fenetre, true, TypeFormulaire.AFFICHAGE, NemoVelo.techniciens.get(row)).setVisible(true);
    }

    public void afficherVeloDetail(int row) {
        new VeloForm(fenetre, true, TypeFormulaire.AFFICHAGE, NemoVelo.velos.get(row)).setVisible(true);
    }

    public void afficherIncidentDetail(int row) {
        new IncidentForm(fenetre, true, TypeFormulaire.AFFICHAGE, NemoVelo.incidents.get(row)).setVisible(true);
    }

    @Override
    public void update(String str) {
        if (str.equals(Velo.class.getSimpleName())) {
            veloModel.fireTableDataChanged();
        } else if (str.equals(Incident.class.getSimpleName())) {
            incidentTableModel.fireTableDataChanged();
        } else if (str.equals(Technicien.class.getSimpleName())) {
            technicienTableModel.fireTableDataChanged();
        } else if (str.equals(TypeIncident.class.getSimpleName())) {
            typeTableModel.fireTableDataChanged();
        }
    }
}
